package com.vision.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.vision.mapper.MessageMapper;
import com.vision.pojo.entity.Message;
import com.vision.pojo.vo.ChatUserVO;
import com.vision.pojo.vo.MessageVO;
import com.vision.pojo.vo.PageVO;
import com.vision.pojo.vo.SystematicNotificationVO;
import com.vision.service.MessageService;
import com.vision.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class MessageServiceImpl implements MessageService {
    @Autowired
    private MessageMapper messageMapper;

    /**
     * 获取所有系统通知
     * @return 所有系统通知
     */
    @Override
    public PageVO<SystematicNotificationVO> getAllSystematicNotification(Integer pageNum, Integer pageSize) {
        // 1. 创建 PageVO 对象
        PageVO<SystematicNotificationVO> pageVO = new PageVO();
        // 2. 开启分页查询
        PageHelper.startPage(pageNum,pageSize);
        // 3. 查询所有系统通知
        List<SystematicNotificationVO> messageList = messageMapper.getAllSystematicNotification();
        Page<SystematicNotificationVO> messagePage = (Page<SystematicNotificationVO>) messageList;
        // 4. 将查询到的数据封装到 pageVO 中
        pageVO.setItems(messagePage.getResult());
        pageVO.setPageNum(pageNum);
        pageVO.setPageSize(pageSize);
        pageVO.setTotal(messagePage.getTotal());
        // 5. 返回 pageVO
        return pageVO;
    }

    /**
     * 获取所有同聊天的用户
     * @param pageNum 页码
     * @param pageSize 每页显示的条数
     * @return 所有聊天记录
     */
    @Override
    public PageVO<ChatUserVO> getAllChatList(Integer pageNum, Integer pageSize) {
        // 1. 获取当前登录用户 id
        Map<String,Integer> claims = ThreadLocalUtil.get();
        Integer userId = claims.get("id");
        // 2. 创建 PageVO 对象
        PageVO<ChatUserVO> pageVO = new PageVO<>();
        // 3. 开启分页查询
        PageHelper.startPage(pageNum,pageSize);
        // 4. 查询所有同用户聊天的用户
        List<ChatUserVO> list = messageMapper.selectAllChatList(userId);
        Page<ChatUserVO> chatList = (Page<ChatUserVO>) list;
        // 5. 将查询到的数据封装到 pageVO 中
        pageVO.setItems(chatList.getResult());
        pageVO.setTotal(chatList.getTotal());
        pageVO.setPageNum(pageNum);
        pageVO.setPageSize(pageSize);
        // 6. 返回 pageVO
        return pageVO;
    }

    /**
     * 获取所有聊天记录
     * @param pageNum 页码
     * @param pageSize 每页显示的条数
     * @param talkingId 目标对象聊天 id
     * @return 所有聊天记录
     */
    @Override
    public PageVO<MessageVO> getAllChatHistory(Integer pageNum, Integer pageSize, Integer talkingId) {
        // 1. 获取当前登录用户 ID
        Map<String, Integer> claims = ThreadLocalUtil.get();
        Integer userId = claims.get("id");
        // 2. 创建 pageVO 对象
        PageVO<MessageVO> pageVO = new PageVO<>();
        // 3. 开启分页查询
        PageHelper.startPage(pageNum,pageSize);
        // 4. 查询所有聊天记录
        List<MessageVO> list = messageMapper.selectAllChatHistory(userId,talkingId);
        if (list == null) {
            throw new RuntimeException("聊天记录为空");
        }
        Page<MessageVO> messagePage = (Page<MessageVO>) list;
        // 5. 讲查询到的数据封装到 pageVO 中
        pageVO.setItems(reverseList(messagePage.getResult())); // 将 list 集合反转
        pageVO.setTotal(messagePage.getTotal());
        pageVO.setPageNum(pageNum);
        pageVO.setPageSize(pageSize);
        // 6. 返回 pageVO
        return pageVO;
    }

    /**
     * 保存消息
     * @param message 消息
     */
    @Override
    public void saveMessage(Message message) {
        messageMapper.insertMessage(message);
    }

    /**
     * 删除聊天记录
     * @param talkingId 目标对象聊天 id
     */
    @Override
    public void removeHistory(Integer talkingId) {
        // 1. 获取当前用户 id
        Map<String, Integer> claims = ThreadLocalUtil.get();
        Integer userId = claims.get("id");
        // 2. 删除聊天记录
        messageMapper.deleteHistory(userId,talkingId);
    }

    /**
     * 将 list 集合反转
     * @param list 需要反转的 list 集合
     * @param <T> 泛型
     * @return 反转后的 list 集合
     */
    private <T> List<T> reverseList (List<T> list) {
        List<T> reverseList = new ArrayList<>();
        for (int i = list.size() - 1; i >= 0; i--) {
            reverseList.add(list.get(i));
        }
        return reverseList;
    }
}
